%-----------------------------------------------------------------------------
\chapter{Stand der Technik}
%-----------------------------------------------------------------------------
Definitionen und die Suche im Allgemeinen sind die Hauptbestandteile dieses
Kapitels. Wobei nur jene Definitionen, Verfahren und Möglichkeiten beschrieben
werden, die für die Arbeit relevant sind.


%-----------------------------------------------------------------------------
\section{Definition Code Snippet}
%-----------------------------------------------------------------------------
Im Englischen bezeichnet man ein Schnippel oder ein Bruchstück als "`snippet"'.
Ein Code Snippet ist also ein Teil aus einem Sourcecode, bei dem vor allem die
Wiederverwendbarkeit ein wichtiger Punkt ist \cite[S. 4]{Baum10}.

%-----------------------------------------------------------------------------
\section{Sucharten}
%-----------------------------------------------------------------------------
Bei der Realisierung einer Suche unterscheidet man zwischen Online-Suche und
indexgestützter Suche \cite[S. 2 f]{Nava07}. 

%-----------------------------------------------------------------------------
\subsection{Online-Suche}
%-----------------------------------------------------------------------------
Bei der Online-Suche wird der gesamte Datenbestand sequentiell analysiert, um
jene Einträge zu finden, die gesucht wurden. Die dabei notwendigen
Vergleiche von Strings sind sehr aufwendig. Online-Suche wird daher für kleinere
Datenbestände oder wenn die Daten sehr oft geändert werden, wie z.B. bei
Aktienkursen, verwendet.


%-----------------------------------------------------------------------------
\subsection{Indexgestützte-Suche}
%-----------------------------------------------------------------------------
Bei der Indexgestützen-Suche erfolgt vor der Suche eine Indizierung. Dabei
wird aus den Daten eine für die Suchanfrage geeignete Datenstruktur, auch Index
genannt, erstellt. Die Suche erfolgt dann innerhalb dieser Datenstruktur und
nicht mehr in den Daten selbst. Bei großen Datenmengen kann diese Variante ihre
Vorzüge ausspielen.


%-----------------------------------------------------------------------------
\section{Definition Volltextsuche}
%-----------------------------------------------------------------------------
Das Grundprinzip der Volltextsuche ist, dass der/die BenutzerIn eine
(typischerweise kleine) Gruppe von Schlüsselwörtern eingibt und die
Suchmaschine liefert eine Liste von Dokumenten, in denen einige oder alle dieser
Schlüsselwörter (oder Variationen bzw. Synonyme davon) auftreten
\cite[S. 1]{Bast12}.
\newline
\newline
In der traditionellen Volltextsuche werden Schlüsselwörter als
Suchbegriffe eingegeben und das Ergebnis ist dann eine Liste von Dokumenten, die
einige oder alle dieser Schlüsselwörter enthalten und im Idealfall noch nach
Relevanz sortiert ist \cite[S. 136]{Bast13}.
\newline
\newline
Im Internet ist die Volltextsuche durch die massive Präsenz diverser
Suchanbieter mittlerweile der Standard geworden. So ist eine Suche im Internet
ohne Volltextsuche unvorstellbar \cite[S. 4]{Konr09}.

%-----------------------------------------------------------------------------
\subsection{Indexierung}
%-----------------------------------------------------------------------------
Unter Indexierung versteht man das Anlegen eines Indexes, einer
Liste oder eines Verzeichnisses \cite[S. 565]{Dude84}.


%-----------------------------------------------------------------------------
\subsection{Tokenisierung}
%-----------------------------------------------------------------------------
Die Zerteilung eines Textes in die kleinste sinngebende Einheit (auch Token
genannt) nennt man Tokenisierung. Der Tokenizer ist der erste Schritt der
Suchraumaufbereitung.


%-----------------------------------------------------------------------------
\subsection{Stemming}
%-----------------------------------------------------------------------------
Stemming reduziert die Vielfalt der Darstellungen eines Konzepts (Wortes) zu
einer kanonischen morphologischen Darstellung. Dabei besteht allerdings die
Gefahr, dass durch die Zusammenführung Information verloren geht, was zu einer
Abnahme der Genauigkeit des Rankings führen kann. Der Vorteil von Stemming ist,
dass die Trefferquote verbessert wird \cite[S. 76 f]{Kowa10}.
\newline
\newline
Durch Stemming, oft auch als "`Wortstammsuche"' bezeichnet, werden die Wörter
auf ihren Stamm zurückgeführt, z.B. wird die Einzahl und Mehrzahl eines Wortes
oder auch "`essen"' und "`aß"' zusammengeführt. Daraus ergibt sich, dass Stemming 
in unterschiedlichen Sprachen unterschiedlich ist.


%-----------------------------------------------------------------------------
\subsection{Lemmatization}
%-----------------------------------------------------------------------------
Lemmatization (in der Literatur teilweise auch "`Lemmatisation"' geschrieben)
ist Stemming ähnlich. Dabei werden jedoch durch Nachschlagen in einem Wörterbuch
verschiedene Wörter aufeinander abgebildet. Dabei wird mehr gemacht, als nur die
Endungen eines Wortes variiert, sondern Wörter wie z. B. "`i-pod"', "`iPod"' und
"`ipod"' oder "`Weihnachten"' und "`Weinachtsmann"' auf einander gemapt
\cite[S. 76 f]{Kowa10}.
\newline
\newline
Als Lemma bezeichnet man in der Germanistik die Grundform eines Wortes. Es ist
also jenes Wort, unter dem man das aufzubereitende Wort in einem Lexikon oder
Wörterbuch findet.



%-----------------------------------------------------------------------------
\subsection{Stop Word}
%-----------------------------------------------------------------------------
Im Zusammenhang mit Volltextsuche bezeichnet man Wörter, die keine Relevanz
für das Dokument haben, als "`Stoppwörter"' (engl. "`stop words"'). In
deutschsprachigen Dokumenten werden sämtliche Füllwörter wie Artikel
(z.B. der, eine) oder Konjunktionen (z. B. und, oder) als Stoppwörter
definiert. Auch hier ergibt sich, dass Stoppwortlisten für unterschiedliche
Sprachen unterschiedlich sind.


%-----------------------------------------------------------------------------
\subsection{Indizierung}
%-----------------------------------------------------------------------------
Das Indizieren ist ein auf den Index setzen \cite[S. 566]{Dude84}. Es ist also
die Überführung eines Suchraumes in einen Index.
\newline
\newline
Die eventuell vorangegangene Aufbereitung des Suchraumes durch Stemming,
Lemmatization, Stopwordlists etc. hat den Sinn, den Index so klein wie möglich
zu halten. Dies erfolgt entweder durch Herausfiltern von nicht relevanten
Wörtern oder durch Mappen verschiedener Wörter. Dadurch kann eine effiziente
Volltextsuche zur Verfügung gestellt werden.


%-----------------------------------------------------------------------------
\subsection{Ranking}
%-----------------------------------------------------------------------------
Aufgrund der Mehrdeutigkeiten von Suchabfragen liefert eine Volltextsuche im
allgemeinen eine Vielzahl von Ergebnissen, wovon ein großer Teil für die
Abfrage nicht relevant ist. Daher hat bei der Volltextsuche das Ranking der
Ergebnisse eine besonders große Bedeutung und es gibt
unterschiedliche Strategien, die die Ergebnisse in folgender
Reihenfolge sortieren:
\begin{enumerate}
	\item je öfter ein Schlüsselwort erscheint, desto relevanter
	ist das Ergebnis;
	\item je unterschiedlicher die Schlüsselwörter in der Datenbank sind, desto
	relevanter sind die Ergebnisse;
	\item je kleiner die Anzahl eines Ergebnisses ist, desto relevanter ist das
	Ergebnis.
\end{enumerate}
\cite[S. 1]{Zeng12}.
\newline
\newline
Bei Suchmaschinen wird das Ranking auch durch die Anzahl der Links,
die auf die Seite verweisen, beeinflusst. Diese Linkpopularität
ist nur einer von vielen Faktoren, die die Reihenfolge der
Ergebnisse bei Suchmaschinen bestimmen.


%-----------------------------------------------------------------------------
\subsection{Apache Lucene}
%-----------------------------------------------------------------------------
Lucene ist eine leistungsstarke, skalierbare Suchmaschinen-Bibliothek
zur Informationsbeschaffung (im Englischen "`Information Retrieval"' (IR)
genannt). IR bezieht sich auf den Prozess der Suche nach Dokumenten, Informationen innerhalb von
Dokumenten oder Metadaten über Dokumente. Lucene ermöglicht das Hinzufügen von
Suchfunktionen zu einer Anwendung. Lucene ist ein in Java
implementiertes, ausgereiftes und kostenloses Open-Source-Projekt in der Apache
Software Foundation. Als solches ist Lucene schon seit mehreren Jahren die
beliebteste kostenlose IR Bibliothek \cite [S.6]{McCa10}.
\newline
\newline
Im Gegensatz zu den meisten Volltext-Suchmaschinen, die nur "`Indizierung"' und
dann die "`Suche"' anbieten, erfolgt bei Lucene eine zusätzliche Detaillierung.
\newline
\newline
Bei der Indizierung durch Lucene wird zuerst der Suchraum aufbereitet und
anschließend indiziert. Nach der Eingabe des Suchtextes, wird dieser wieder
zuerst aufbereitet, dann erfolgt die eigentliche Suche. Erst mit der
Präsentation der Ergebnisliste, die nach bestimmten Kriterien gereiht ist,
ist die Suche dann abgeschlossen.



%-----------------------------------------------------------------------------
\subsection{Apache Solr}
%-----------------------------------------------------------------------------
Apache Solr ist ein Open-Source-Projekt von Apache Software
Foundation und dient zum Aufbau von Suchmaschinen.
Apache Solr basiert auf Apache Lucene und bietet als
Server-Software Services für Indizierung und Suche an, wobei die Schnittstellen
zu Apache Solr sprachunabhängig sind \cite{Apac13}.
 

%-----------------------------------------------------------------------------
\subsection{Sunspot}
%-----------------------------------------------------------------------------
Sunspot ist eine Bibliothek für Ruby, um die Interaktion mit einem Solr
Server zu vereinfachen.
Sie baut auf die RSolr Bibliothek auf, die eine Low-Level-Schnittstelle
für Solr Interaktion bietet. Sunspot liefert eine einfache, intuitive,
expressive DSL durch leistungsstarke Funktionen für die Indizierung und
gesicherte Objekte für die Suche \cite{Suns13}.


%-----------------------------------------------------------------------------
\subsection{Elasticsearch}
%-----------------------------------------------------------------------------
Elasticsearch ist ein Open Source Search Server, der auf die Java Search Library
Apache Lucene aufsetzt. Es wurde speziell für die Suche in verteilten Systemen
oder der Cloud entwickelt \cite{Elas13}.


%-----------------------------------------------------------------------------
\section{Datenbankverwaltungssystem}
%-----------------------------------------------------------------------------
Ein Datenbankverwaltungssystem, oder kurz auch Datenbanksystem (DBMS) genannt,
besteht aus den eigentlichen Daten und aus Programmen, die für die
Datenverarbeitung benötigt werden:

\begin{itemize}
	\item Die gespeicherten Daten, oft auch Datenbasis genannt, enthalten
	Informationseinheiten, die miteinander in Beziehung stehen und für die
	Steuerung und Kontrolle eines Aufgabengebietes notwendig sind.
	\item Das Datenbankenverwaltungssystem ist die Gesamtheit aller Programme, die
	Datenzugriff, Kontrolle der Datenkonsistenz und Datenmodifikation
	gewährleisten.
\end{itemize}
Oft werden diese Bereiche nicht so genau getrennt und als
"`Datenbankverwaltungssystem"' oder "`Datenbanksystem"' zusammengefasst.
\cite[S. 19]{Eick11}


%-----------------------------------------------------------------------------
\subsection{Suchmöglichkeiten in Datenbanksystemen}
%-----------------------------------------------------------------------------
In Datenbanksystemen wird meist indexgestützt gesucht.
Mit zunehmender Datenmenge wird in heutiger Zeit die Volltextsuche in immer mehr
DBMS integriert. Dies geschieht auch, um den Anforderungen der BenutzerInnen
gerecht zu werden.


%-----------------------------------------------------------------------------
\section{Versionskontrolle}
%-----------------------------------------------------------------------------
Der Begriff "`Versionskontrolle"' bezeichnet das Aufzeichnen und Abrufen von
Änderungen an einem Projekt. Ein Versionskontrollsystem ermöglicht es, eine alte
Version abzurufen, um Fehler zu beheben oder Funktionen zu aktualisieren, eine
Entwicklung verzweigen zu lassen, damit das Projekt auf mehreren Bahnen
gleichzeitig weiterlaufen kann, und Berichte zu generieren, die Änderungen
zwischen zwei beliebigen Stadien des Projektes auszuweisen \cite[S. 3
f]{Vesp04}.

Die Hauptaufgaben einer Versionskontrolle sind:
\begin{itemize}
	\item Protokollierungen von Änderungen an Dateien, damit jederzeit
	nachvollziehbar ist, wann wer was geändert hat.
	\item Wiederherstellung von alten Versionen zu ermöglichen
	\item Erleichterung der Zusammenarbeit mehrerer ProgrammiererInnen an einem
	Projekt
\end{itemize}


Versionskontrollen kann man grundsätzlich nach ihrer Funktionsweise in drei
Arten unterteilen:

%-----------------------------------------------------------------------------
\subsection{Lokale Versionskontrolle}
%-----------------------------------------------------------------------------
Lokale Versionskontrollen werden oft nur für einzelne Dateien verwendet. Die
Änderungen werden direkt im Dokument in Form eines Änderungsindexes gespeichert,
daher ist diese Versionskontrolle nur in einem sehr kleinen Rahmen sinnvoll.

%-----------------------------------------------------------------------------
\subsection{Zentrale Versionskontrolle}
%-----------------------------------------------------------------------------
Zentrale Versionskontrollen sind in Form eines Client-Server-Systems aufgebaut
und das Repository am Server hat die gesamte Versionsgeschichte gespeichert. 


%-----------------------------------------------------------------------------
\subsection{Verteilte Versionskontrolle}
%-----------------------------------------------------------------------------
Bei verteilten Versionskontrollen hat jeder Client sein eigenes Repository und
kann sich mit dem Repository jedes anderen Clients abgleichen. Dies hat den
großen Vorteil, dass man mit der Versionskontrolle auch "`off-line"' arbeiten
kann, dann laufen die Operationen lokal und performant.


%-----------------------------------------------------------------------------
\section{Git}
%-----------------------------------------------------------------------------
Git zählt zu den verteilten Versionskontrollen und sieht die Daten als eine
Reihe von Schnappschüssen. Bei jedem "`commit"' wird der Zustand sämtlicher
Dateien zu diesem Zeitpunkt gespeichert. Genauer gesagt werden die geänderten
Dateien und bei unveränderten Dateien nur die Referenzen gespeichert. Dadurch
erfolgt ein "`commit"' schnell und sehr effizient \cite[S. 3 ff]{Scot09}.
\newline
\newline
Git holt sich die Informationen für die meisten Operationen aus den eigenen
lokalen Dateien und Ressourcen. Dies garantiert, dass die meisten Operationen
ohne jede Verzögerung und sehr schnell ausgeführt werden. Wird mit einem
Repository auf einem Server gearbeitet, hat jeder Client eine vollständige Kopie
dieses Repositorys. Durch diese Architektur von Git ist es
möglich, mit Git arbeiten zu können, auch wenn keine Verbindung zum
Serverrepository besteht. Bei der nächsten Möglichkeit wird das Serverrepository
wieder aktualisiert \cite[S. 33 ff]{Loeg09}.


%-----------------------------------------------------------------------------
\subsection{Repository}
%-----------------------------------------------------------------------------
Um mit anderen ProgrammiererInnen via Git zusammenarbeiten zu können, besteht
die Möglichkeit, auf externe Repositorien zugreifen zu können.
\newline
\newline
Das eigene Repository kann auch mehrere externe Repositorien enthalten,
wobei jedes unterschiedliche Berechtigungen (lesend oder lesend und
schreibend) haben kann \cite[S. 35 ff]{Scot09}.


%-----------------------------------------------------------------------------
\section{Analyse der Suche}
%-----------------------------------------------------------------------------
Die Analyse komfortabler und viel benutzter Volltextsuchen soll Optionen und
Features aufzeigen, was eine komfortable Suche ausmacht. Die 
Beispiele wurden deshalb ausgewählt, weil die Suche in ihrem Fall jeweils
ein elementarer Bestandteil ist. Daher bieten sie auch eine schnelle, intuitive
und bequeme Suche an.


%-----------------------------------------------------------------------------
\subsection{Analyse der Suche bei Internetsuchmaschinen}
%-----------------------------------------------------------------------------
Suche im Internet wird mit der Google-Suche assoziiert. Google bietet
folgende Features und Optionen bei der Suche an (siehe Abb.
~\ref{GoogleSucheFilterung}):
\begin{itemize}
	\item Bei der Eingabe des Suchwortes wird eine Vorschlagsliste angezeigt, wobei
	eine Autokorrektur bei der Vorschlagsliste berücksichtigt wird
	\item Das Suchergebnis kann weiter nach Kategorien wie "`Web"', "`Bilder"',
	"`Map"' eingeschränkt werden.
	\item Für jede dieser Kategorien besteht eine eigene weitere Möglichkeit der
	Einschränkung. Bei "`Bilder"' sind das z.B. "`Größe"', "`Farbe"',
	"`Typ"'. Wobei es auch möglich ist, mehrere Einschränkungen gleichzeitig zu
	wählen.
	\item Bei Änderung des Suchbegriffes bleiben sämtliche Einschränkungen
	erhalten.
	\item Es besteht die Möglichkeit, jede Einschränkung des Suchergebnisses
	zurückzusetzen.
	\item Bei jeder Änderung von Kategorie oder einer Einschränkung wird das
	Suchergebnis automatisch aktualisiert.
\end{itemize}

\begin{figure}[htbp]
    \centering
    \includegraphics [width=16cm,angle=0] {figures/google_search.png}
    \caption{Google Suche und Filterung}
    \label{GoogleSucheFilterung}
\end{figure}

Die Analyse von Bing (www.bing.com) ergibt die gleichen Features und Optionen
für die Suche (siehe Abb. ~\ref{BingSucheFilterung}):
\begin{figure}[htbp]
    \centering
    \includegraphics [width=16cm,angle=0] {figures/bing_search.png}
    \caption{Bing Suche und Filterung}
    \label{BingSucheFilterung}
\end{figure}

%-----------------------------------------------------------------------------
\subsection{Analyse der Suche bei Onlineshops}
%-----------------------------------------------------------------------------
Bei Onlineshops spielt die Suche über die Produkte eine wichtige
Rolle, weil sie sich direkt auf das Verhalten der KundenInnen auswirkt. Die
Suche von Amazon (www.amazon.de) offeriert dafür folgende Features und Optionen
(siehe Abb. ~\ref{AmazonSucheFilterung}):

\begin{figure}[htbp]
    \centering
    \includegraphics [width=16cm,angle=0] {figures/amazon_search.png}
    \caption{Amazon Suche und Filterung}
    \label{AmazonSucheFilterung}
\end{figure}


\begin{itemize}
	\item Bei der Eingabe des Suchwortes wird eine Vorschlagsliste angezeigt.
	\item In der Vorschlagsliste werden andere Kategorien berücksichtigt und die
	entsprechende Kategorie angezeigt. 
	\item Das Suchergebnis kann weiter nach Kategorien wie "`Bücher"', "`Musik"',
	"`MP3 Musik"' und Unterkategorien eingeschränkt werden, wobei die
	Anzahl der gefundenen Einträge pro Kategorie und pro Unterkategorie angezeigt
	wird.
	\item Weitere Einschränkungen, die von der Kategorie abhängig sind, stehen zur
	Verfügung. Z.B. gibt es in der Kategorie "`Bücher"' Einschränkungen nach
	"`Autor"', "`Format"' etc.
	\item Bei Änderung der Kategorie erfolgt keine Anpassung des Suchergebnisses.
\end{itemize}

Eine Analyse der Suche auf Zalando (www.zalando.at) ergibt bis auf kleine
Abweichungen (z.B. wird bei Änderungen der Unterkategorie der Suchstring
gelöscht) die gleichen Features und Optionen (siehe Abb.
~\ref{ZalandoSucheFilter}). 

\begin{figure}[htbp]
    \centering
    \includegraphics [width=16cm,angle=0] {figures/zalando_search.png}
    \caption{Zalando Suche und Filterung}
    \label{ZalandoSucheFilter}
\end{figure}


%-----------------------------------------------------------------------------
\section{Konzept der idealen Speicherstruktur}
%-----------------------------------------------------------------------------
Aus den Anforderungen an die Suche und Filtermöglichkeit einer Code Snippet
Collection \cite[S. 33 f]{Breg11} und aus den Analysen der Suchen bei
Internetsuchmaschinen und Onlineshops ergeben sich als ideale Suchoptionen:

\begin{itemize}
	\item ein Suchfeld für die Volltextsuche nach Titel, Beschreibung und
	Source Code
	\item Filtermöglichkeit des Ergebnisses nach Programmiersprachen
	\item Filtermöglichkeit des Ergebnisses nach vergebenen Tags
	\item Anzeige der Anzahl der gefundenen Einträge für Suche und Filterung
	\item Kombinierbarkeit mehrerer Filter miteinander
	\item Farbliche Markierung des Suchbegriffes im Suchergebnis
\end{itemize}

Als ideale Struktur zur Speicherung von Code Snippets ergibt sich daher, dass
die Code Snippets in einer verteilten Versionsverwaltung gespeichert werden. Die
zu speichernden Daten je Code Snippet sind daher: 
\begin{itemize}
	\item Titel - eine kurze, aussagekräftige Beschreibung des Code Snippets 
	\item Beschreibung - eine genauere Beschreibung, was das Code Snippet genau
	macht und wozu es eingesetzt werden kann
	\item Programmiersprachen - für welche Programmiersprache(n) das Code Snippet
	verwendet werden kann
	\item vergebene Tags - sind ähnlich wie eine Kategorisierung, wobei ein Code
	Snippet auch mehreren Tags zugeordnet werden kann.
\end{itemize}

Die Struktur kann alle Code Snippets unabhängig von der Programmiersprache
gleich speichern, weil es für die Suche keinen Unterschied macht, in welcher
Sprache der Sourcecode geschrieben ist.
